import 'dart:io';

import 'package:path_provider/path_provider.dart';

class UtilsDirectory {
  /// 文档目录
  /// 文档目录用于存储只能由该应用访问的文件，系统不会清除该目录，只有在删除应用时才会消失。
  static Future<Directory> requestAppDocumentsDirectory() async {
    Directory appDocumentsDirectory = await getApplicationDocumentsDirectory();

    return appDocumentsDirectory;
  }

  /// 应用程序支持目录
  /// 应用程序支持目录用于不想向用户公开的文件，也就是你不想给用户看到的文件可放置在该目录中，系统不会清除该目录，只有在删除应用时才会消失。
  static Future<Directory> requestAppSupportDirectory() async {
    Directory appSupportDirectory = await getApplicationSupportDirectory();
    return appSupportDirectory;
  }

  /// 应用程序持久文件目录 only iOS and macOS.
  /// 该目录主要存储持久文件的目录，并且不会对用户公开，常用于存储数据库文件，比如sqlite.db等。
  static Future<Directory> requestAppLibraryDirectory() async {
    Directory appLibraryDirectory = await getLibraryDirectory();
    return appLibraryDirectory;
  }

  /// 外部存储目录
  /// 主要用于获取外部存储目录，如SD卡等，但iOS不支持外部存储目录，目前只有Android才支持。
  static Future<Directory?> requestExternalStorageDirectory() async {
    Directory? externalDocumentsDirectory = await getExternalStorageDirectory();
    return externalDocumentsDirectory!;
  }

  ///外部存储目录（单独分区）
  /// 可根据类型获取外部存储目录，如SD卡、单独分区等，和外部存储目录不同在于他是获取一个目录数组。但iOS不支持外部存储目录，目前只有Android才支持。
  static Future<List<Directory>?> requestExternalStorageDirectories(StorageDirectory type) async {
    List<Directory>? externalStorageDirectories =
        await getExternalStorageDirectories(type: type);
    return externalStorageDirectories;
  }

  ///外部存储缓存目录
  ///主要用户获取应用程序特定外部缓存数据的目录，比如从SD卡或者手机上有多个存储目录的，但iOS不支持外部存储目录，目前只有Android才支持。
  requestExternalCacheDirectories() async {
    List<Directory>? externalCacheDirectories =
        await getExternalCacheDirectories();
    return externalCacheDirectories;
  }

  ///桌面程序下载目录
  static Future<Directory?> requestDownloadsDirectory() async {
    Directory? downloadsDirectory = await getDownloadsDirectory();
    return downloadsDirectory;
  }

  /// 临时目录
  /// 临时目录的是系统可以随时清空的缓存文件夹
  static Future<Directory> requestTempDirectory() async {
    Directory tempDirectory = await getTemporaryDirectory();
    return tempDirectory;
  }
}
